/*
 * VectorRegistros.h
 *
 *	Contiene los registros que forman al nodo y las operaciones necesarias
 *	para trabajar con ellos en un arbol B+
 */

#ifndef VECTORREGISTROS_H_
#define VECTORREGISTROS_H_

#include <list>
#include "RegistroAbstracto.h"
#include "ArbolCommons.h"

using namespace ArbolCommons;

class VectorRegistros {
	private:
		size_t _espacioLibre;
		size_t _cantBytesOcupados;
		std::list<RegistroAbstracto*> _listRegs;

		// Para evaluar la existencia de underflow
		bool hayUnderFlow();
	public:
		VectorRegistros(size_t tamBytes);
		~VectorRegistros();

		// Inserta el registro apuntado al vector
		resulOperacion addRegistro(RegistroAbstracto* reg);

		// Quita el registro que contiene el id señalado
		resulOperacion removeRegistro(std::string id);

		// Devuelve una referencia al registro que contiene el id señalado,
		// NULL si no existe 
		RegistroAbstracto* getRegistro(std::string id);

		// Señala si existe un registro con el id indicado
		bool existeRegistro(std::string id);

		// Devuelve la cantidad de bytes ocupados por todos los registros
		size_t getSize();

		// Devuelve la cantidad de registros guardados en el vector
		size_t getCantRegistros();

		// Permite acceder al registro interno usando acceso directo
		RegistroAbstracto* operator[](int i);

		// Divide en forma equitativa los registros entre los dos contenedores
		bool split(VectorRegistros* newContenedor);

		// Absorve todos los registros del contenedor, si el espacio no es
		// suficiente devuelve "false" indicando un error
		bool merge(VectorRegistros* oldContenedor);

		/* Serialización de registros:
		 * 	Para serializar los registros de forma eficiente es necesario almazenar
		 * 	cierta metadata, en este caso seria:
		 * 		(tamDatos;cantRegistros;dataReg0;...)
		 * 	donde:
		 * 		tamDatos: es el tamaño total opcupado por los datos
		 * 		cantRegistros: la cantidad de registros que fueron serializados
		 * 		dataReg0: los datos del registro 0
		 * */

		// Carga todos los registros serializados en la memoria apuntada
		void pack(char* &data);

		// Toma un bloque de memoria y extrae del mismo todos los registros
		void unpack(char* data, datosArchivados tipo, bool esHoja);
};


#endif /* VECTORREGISTROS_H_ */
